home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2006 May / PCpro_2006_05.ISO / files / mobile / fma-2.0-stable-setup.exe / {app} / source / uOptions.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2005-01-26  |  36.4 KB  |  1,164 lines

  1. unit uOptions;
  2.  
  3. {
  4. *******************************************************************************
  5. * Descriptions: Main Unit for FMA
  6. * $Source: /cvsroot/fma/fma/uOptions.pas,v $
  7. * $Locker:  $
  8. *
  9. * Todo:
  10. *
  11. * Change Log:
  12. * $Log: uOptions.pas,v $
  13. * Revision 1.32.6.3  2005/01/25 16:03:19  z_stoichev
  14. * Merged with 2.1 Beta 1 bugfixes
  15. *
  16. * Revision 1.32.6.2  2004/10/15 11:27:59  z_stoichev
  17. * Bugfixes
  18. *
  19. * Revision 1.32.6.1  2004/10/14 16:43:28  z_stoichev
  20. * Bugfixes
  21. *
  22. * Revision 1.32  2004/07/26 12:53:48  z_stoichev
  23. * - Fixed Outlook contacts folders Factory defaults.
  24. * - Changed Options IrmcSync sanity check and user interface.
  25. * - Added Force UCS-2 new text message encoding.
  26. *
  27. * Revision 1.31  2004/07/25 14:40:03  lordlarry
  28. * Fixed: Different Outlook Categories where seen as one Category. Users need to setup Categories again.
  29. *
  30. * Revision 1.30  2004/07/25 13:30:37  lordlarry
  31. * Added the ability to select the Outlook folder where all the New contacts end up.
  32. *
  33. * Revision 1.29  2004/07/01 09:12:19  z_stoichev
  34. * - Fixed Startup options Factory default.
  35. * - Fixed Outlook Folders small icons were bad.
  36. * - Added Outlook Folders Refresh and Default buttons.
  37. *
  38. * Revision 1.28  2004/06/30 15:39:04  z_stoichev
  39. * GUI changes.
  40. *
  41. * Revision 1.27  2004/06/29 20:10:18  lordlarry
  42. * Using BeginUpdate EndUpdate for Outlook Folders
  43. *
  44. * Revision 1.26  2004/06/29 12:37:11  z_stoichev
  45. * New message window renamed
  46. *
  47. * Revision 1.25  2004/06/28 16:05:25  z_stoichev
  48. * Outlook Categories Quoted.
  49. *
  50. * Revision 1.24  2004/06/28 15:25:05  z_stoichev
  51. * Outlook Categories recoded.
  52. *
  53. * Revision 1.23  2004/06/25 15:20:38  z_stoichev
  54. * - Added Various phone bookmarks options.
  55. * - Added Factory defaults buttons in options.
  56. * - Changed Made Script usage optional.
  57. *
  58. * Revision 1.22  2004/06/16 08:48:12  z_stoichev
  59. * Added Device Lookup button in Options.
  60. *
  61. * Revision 1.21  2004/06/15 13:00:01  z_stoichev
  62. * Load Outlook folders on need only.
  63. *
  64. * Revision 1.20  2004/06/11 12:29:22  z_stoichev
  65. * Options windows enlarged.
  66. * Outlook folders icons usage.
  67. * Show current SMS counter.
  68. *
  69. * Revision 1.19  2004/06/05 13:32:55  lordlarry
  70. * Merged with OutlookSync branch
  71. *
  72. * Revision 1.18  2004/05/21 10:09:05  z_stoichev
  73. * Changed logging handle routines.
  74. *
  75. * Revision 1.17  2004/05/19 18:34:16  z_stoichev
  76. * Build 0.1.0.35c
  77. *
  78. * Revision 1.16  2004/03/26 18:37:40  z_stoichev
  79. * Build 0.1.0.35 RC5
  80. *
  81. * Revision 1.15  2004/03/14 18:47:38  z_stoichev
  82. * Remember Last User Profile option.
  83. *
  84. * Revision 1.14  2004/03/08 12:21:29  z_stoichev
  85. * Access serial port by name.
  86. *
  87. * Revision 1.13  2004/01/15 14:13:56  z_stoichev
  88. * Added SMS Counter and Warning level.
  89. *
  90. * Revision 1.12  2004/01/14 15:04:59  z_stoichev
  91. * Pascal Scripting support.
  92. *
  93. * Revision 1.11  2003/12/17 17:15:22  z_stoichev
  94. * Added Option to turn off notifications for unsent messages.
  95. *
  96. * Revision 1.10  2003/12/12 16:55:36  z_stoichev
  97. * Added options for do not load Calls and Profiles on connect.
  98. *
  99. * Revision 1.9  2003/11/28 09:38:07  z_stoichev
  100. * Merged with branch-release-1-1 (Fma 0.10.28c)
  101. *
  102. * Revision 1.8.2.8  2003/11/21 10:59:46  z_stoichev
  103. * Tab order fixed, GUI changes.
  104. * Outlook and other preparations.
  105. * Test proximity caption change.
  106. *
  107. * Revision 1.8.2.7  2003/11/12 15:02:11  z_stoichev
  108. * Proximity detection options changed.
  109. *
  110. * Revision 1.8.2.6  2003/11/11 13:12:51  z_stoichev
  111. * New options introduced.
  112. *
  113. * Revision 1.8.2.5  2003/11/10 14:03:10  z_stoichev
  114. * RC3
  115. *
  116. * Revision 1.8.2.4  2003/10/31 14:50:33  z_stoichev
  117. * Proximity preparations.
  118. *
  119. * Revision 1.8.2.3  2003/10/29 12:02:43  z_stoichev
  120. * Options to disable Obex, IrmcSync and to
  121. * disable initial loading of Gruops and Folders.
  122. *
  123. * Revision 1.8.2.2  2003/10/28 12:59:38  z_stoichev
  124. * Added option to select clock sync mode.
  125. * Some GUI changes, added some texts.
  126. * Prepare for protocol advanced options.
  127. *
  128. * Revision 1.8.2.1  2003/10/27 07:22:54  z_stoichev
  129. * Build 0.1.0 RC1 Initial Checkin.
  130. *
  131. * Revision 1.8  2003/10/22 13:18:09  z_stoichev
  132. * Add checkbox for Progress dialog usage.
  133. * Add checkbox for Show progress dialog on long operations.
  134. * Add checkbox for Move SMS to Archive warning.
  135. * GUI changed.
  136. *
  137. * Revision 1.7  2003/10/17 09:14:59  z_stoichev
  138. * Default Obex packet size set to 255 (by specs).
  139. * Added header comments.
  140. * Changed GUI.
  141. *
  142. *
  143. * 04/02/2003 - Modified by Crino
  144. * Added the synchronize option
  145. * General tab renamed in Window
  146. *
  147. *******************************************************************************
  148. }
  149.  
  150. interface
  151.  
  152. uses
  153.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  154.   Dialogs, StdCtrls, RXSpin, ComCtrls, Placemnt, ExtCtrls, Spin,
  155.   TntStdCtrls, Mask, CPortCtl, VirtualTrees, Outlook8, ImgList,
  156.   WIrCOMMSocket, WSocket, WBluetoothSocket, PBFolderDialog, TntComCtrls,
  157.   Menus;
  158.  
  159. type
  160.   TfrmOptions = class(TForm)
  161.     PageControl1: TPageControl;
  162.     Button1: TButton;
  163.     Button2: TButton;
  164.     TabSheet1: TTabSheet;
  165.     TabSheet2: TTabSheet;
  166.     TabSheet3: TTabSheet;
  167.     cbObexPacketSize: TGroupBox;
  168.     seMaxPacketSize: TEdit;
  169.     seMaxPacketSizeSpin: TUpDown;
  170.     lblObexPacketSize: TLabel;
  171.     GroupBox3: TGroupBox;
  172.     Label11: TLabel;
  173.     seCommTimeout: TEdit;
  174.     seCommTimeoutSpin: TUpDown;
  175.     GroupBox4: TGroupBox;
  176.     sePolling: TEdit;
  177.     sePollingSpin: TUpDown;
  178.     Label5: TLabel;
  179.     TabSheet4: TTabSheet;
  180.     OpenDialog1: TOpenDialog;
  181.     TabSheet6: TTabSheet;
  182.     GroupBox5: TGroupBox;
  183.     Label19: TLabel;
  184.     Label20: TLabel;
  185.     chkCallM: TCheckBox;
  186.     TabSheet5: TTabSheet;
  187.     rbSync: TRadioGroup;
  188.     GroupBox7: TGroupBox;
  189.     chkMinButton: TCheckBox;
  190.     TabSheet7: TTabSheet;
  191.     GroupBox9: TGroupBox;
  192.     cbStrictUCScheck: TCheckBox;
  193.     TabSheet8: TTabSheet;
  194.     GroupBox8: TGroupBox;
  195.     cbProgressLongOnly: TCheckBox;
  196.     cbDontProgress: TCheckBox;
  197.     rbPhoneClockSync: TRadioGroup;
  198.     TntLabel1: TTntLabel;
  199.     TabSheet9: TTabSheet;
  200.     GroupBox2: TGroupBox;
  201.     cbProximityLock: TCheckBox;
  202.     cbProximityUnlock: TCheckBox;
  203.     Label24: TLabel;
  204.     Label25: TLabel;
  205.     rgProximityAway: TRadioGroup;
  206.     rgProximityNear: TRadioGroup;
  207.     cbRunSS: TCheckBox;
  208.     GroupBox12: TGroupBox;
  209.     edScriptPath: TTntEdit;
  210.     Button3: TButton;
  211.     Label4: TLabel;
  212.     cbProgressRestoredOnly: TCheckBox;
  213.     btnProximityTest: TButton;
  214.     cbCheckOutbox: TCheckBox;
  215.     TabSheet10: TTabSheet;
  216.     rbOutlookSync: TRadioGroup;
  217.     grOutlookConfirmation: TGroupBox;
  218.     cbConfirmAdding: TCheckBox;
  219.     cbConfirmUpdating: TCheckBox;
  220.     cbConfirmDeleting: TCheckBox;
  221.     grOutlookCategories: TGroupBox;
  222.     cbOutlookAllCategories: TCheckBox;
  223.     btAddCat: TButton;
  224.     btDelCat: TButton;
  225.     rbOutlookNewAction: TRadioGroup;
  226.     TabSheet11: TTabSheet;
  227.     CheckBox3: TCheckBox;
  228.     OutlookImageList: TImageList;
  229.     GroupBox14: TGroupBox;
  230.     tvOutlookFolders: TVirtualStringTree;
  231.     WBtSocket: TWBluetoothSocket;
  232.     WIrSocket: TWIrCOMMSocket;
  233.     GroupBox15: TGroupBox;
  234.     Label30: TLabel;
  235.     edBookmarkDir: TEdit;
  236.     btnSelectFavBookm: TButton;
  237.     rbBookmarks: TRadioGroup;
  238.     Label31: TLabel;
  239.     PBFolderDialog1: TPBFolderDialog;
  240.     GroupBox16: TGroupBox;
  241.     cbDiagram: TCheckBox;
  242.     chkStateMonitor: TCheckBox;
  243.     TabSheet12: TTabSheet;
  244.     gbOnConnected: TGroupBox;
  245.     cbAutoInbox: TCheckBox;
  246.     cbAutoSync: TCheckBox;
  247.     cbAutoOutlookSync: TCheckBox;
  248.     cbAutoProfile: TCheckBox;
  249.     cbAutoBookmarks: TCheckBox;
  250.     gbOnConnecting: TGroupBox;
  251.     cbNoGroups: TCheckBox;
  252.     cbNoFolders: TCheckBox;
  253.     cbNoProfiles: TCheckBox;
  254.     cbNoCalls: TCheckBox;
  255.     cbNoBookmarks: TCheckBox;
  256.     rgExplorer: TRadioGroup;
  257.     GroupBox1: TGroupBox;
  258.     Label3: TLabel;
  259.     Label16: TLabel;
  260.     Label17: TLabel;
  261.     Label18: TLabel;
  262.     Label26: TLabel;
  263.     seComposeSpin: TUpDown;
  264.     seCompose: TEdit;
  265.     seMessage: TEdit;
  266.     seMessageSpin: TUpDown;
  267.     seCall: TEdit;
  268.     seCallSpin: TUpDown;
  269.     seDebug: TEdit;
  270.     seDebugSpin: TUpDown;
  271.     Button4: TButton;
  272.     GroupBox13: TGroupBox;
  273.     Label28: TLabel;
  274.     lblSMSCount: TLabel;
  275.     cbSMSWarning: TCheckBox;
  276.     udSMSCnt: TUpDown;
  277.     edSMSCnt: TEdit;
  278.     cbSMSReset: TCheckBox;
  279.     udSMSCntRst: TUpDown;
  280.     edSMSCntRst: TEdit;
  281.     Button6: TButton;
  282.     GroupBox10: TGroupBox;
  283.     cbNoObex: TCheckBox;
  284.     cbNoIRMC: TCheckBox;
  285.     CheckBox1: TCheckBox;
  286.     Button7: TButton;
  287.     Button9: TButton;
  288.     lvOutlookCats: TTntListView;
  289.     GroupBox17: TGroupBox;
  290.     rbUseIRDA: TRadioButton;
  291.     rbUseSerial: TRadioButton;
  292.     groupSerialPortSetup: TGroupBox;
  293.     Label6: TLabel;
  294.     Label7: TLabel;
  295.     Label2: TLabel;
  296.     Label1: TLabel;
  297.     Label8: TLabel;
  298.     cbRTSFlow: TComboBox;
  299.     cbDTRFlow: TComboBox;
  300.     sePort: TComComboBox;
  301.     cbBaudrate: TComComboBox;
  302.     groupBluetoothSetup: TGroupBox;
  303.     Label13: TLabel;
  304.     Label14: TLabel;
  305.     Label15: TLabel;
  306.     edBTAddress: TMaskEdit;
  307.     edBTPort: TEdit;
  308.     edBTPortSpin: TUpDown;
  309.     rbUseBluetooth: TRadioButton;
  310.     lblDevice: TLabel;
  311.     btnLookupDevice: TButton;
  312.     Button5: TButton;
  313.     Label21: TLabel;
  314.     Edit1: TEdit;
  315.     UpDown1: TUpDown;
  316.     GroupBox18: TGroupBox;
  317.     chkMsgM: TCheckBox;
  318.     cbMsgToArchive: TCheckBox;
  319.     cbMsgFullWarning: TCheckBox;
  320.     GroupBox19: TGroupBox;
  321.     Label23: TLabel;
  322.     lbScriptType: TLabel;
  323.     Label9: TLabel;
  324.     Label10: TLabel;
  325.     Label12: TLabel;
  326.     Button10: TButton;
  327.     cbUseScripts: TCheckBox;
  328.     Button8: TButton;
  329.     GroupBox20: TGroupBox;
  330.     CheckBox6: TCheckBox;
  331.     Label22: TLabel;
  332.     Edit2: TEdit;
  333.     Button11: TButton;
  334.     CheckBox2: TCheckBox;
  335.     CheckBox4: TCheckBox;
  336.     cbNoMsgBaloon: TCheckBox;
  337.     cbNoMsgPopup: TCheckBox;
  338.     Label27: TLabel;
  339.     btnRefreshOutlookFolders: TButton;
  340.     Button12: TButton;
  341.     pmuOutlookFolder: TPopupMenu;
  342.     mniNewContacts: TMenuItem;
  343.     Label29: TLabel;
  344.     cbForceUCS2: TCheckBox;
  345.     procedure edScriptPathChange(Sender: TObject);
  346.     procedure Button3Click(Sender: TObject);
  347.     procedure FormShow(Sender: TObject);
  348.     procedure rbUseSerialClick(Sender: TObject);
  349.     procedure cbDontProgressClick(Sender: TObject);
  350.     procedure cbNoObexClick(Sender: TObject);
  351.     procedure FormCreate(Sender: TObject);
  352.     procedure Button1Click(Sender: TObject);
  353.     procedure Button4Click(Sender: TObject);
  354.     procedure chkMsgMClick(Sender: TObject);
  355.     procedure btnProximityTestClick(Sender: TObject);
  356.     procedure Button6Click(Sender: TObject);
  357.     procedure cbOutlookAllCategoriesClick(Sender: TObject);
  358.     procedure btAddCatClick(Sender: TObject);
  359.     procedure btDelCatClick(Sender: TObject);
  360.       procedure tvOutlookFoldersFreeNode(Sender: TBaseVirtualTree;
  361.       Node: PVirtualNode);
  362.     procedure tvOutlookFoldersGetText(Sender: TBaseVirtualTree;
  363.       Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  364.       var CellText: WideString);
  365.     procedure tvOutlookFoldersInitChildren(Sender: TBaseVirtualTree;
  366.       Node: PVirtualNode; var ChildCount: Cardinal);
  367.     procedure tvOutlookFoldersInitNode(Sender: TBaseVirtualTree;
  368.       ParentNode, Node: PVirtualNode;
  369.       var InitialStates: TVirtualNodeInitStates);
  370.     procedure FormDestroy(Sender: TObject);
  371.     procedure cbNoProfilesClick(Sender: TObject);
  372.     procedure chkStateMonitorClick(Sender: TObject);
  373.     procedure tvOutlookFoldersGetImageIndex(Sender: TBaseVirtualTree;
  374.       Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  375.       var Ghosted: Boolean; var ImageIndex: Integer);
  376.     procedure PageControl1Change(Sender: TObject);
  377.     procedure btnLookupDeviceClick(Sender: TObject);
  378.     procedure btnSelectFavBookmClick(Sender: TObject);
  379.     procedure rbBookmarksClick(Sender: TObject);
  380.     procedure cbNoBookmarksClick(Sender: TObject);
  381.     procedure Button5Click(Sender: TObject);
  382.     procedure Button7Click(Sender: TObject);
  383.     procedure Button8Click(Sender: TObject);
  384.     procedure Button9Click(Sender: TObject);
  385.     procedure lvOutlookCatsSelectItem(Sender: TObject; Item: TListItem;
  386.       Selected: Boolean);
  387.     procedure Button10Click(Sender: TObject);
  388.     procedure cbAutoBookmarksClick(Sender: TObject);
  389.     procedure btnRefreshOutlookFoldersClick(Sender: TObject);
  390.     procedure Button12Click(Sender: TObject);
  391.     procedure tvOutlookFoldersPaintText(Sender: TBaseVirtualTree;
  392.       const TargetCanvas: TCanvas; Node: PVirtualNode;
  393.       Column: TColumnIndex; TextType: TVSTTextType);
  394.     procedure mniNewContactsClick(Sender: TObject);
  395.     procedure pmuOutlookFolderPopup(Sender: TObject);
  396.     procedure tvOutlookFoldersChecked(Sender: TBaseVirtualTree;
  397.       Node: PVirtualNode);
  398.     procedure cbNoIRMCClick(Sender: TObject);
  399.   private
  400.     Outlook: OutlookApplication;
  401.     NmSpace: NameSpace;
  402.     FSelectedOutlookFolders: TStringList;
  403.     FOutlookNewContactsFolder: String;
  404.     OutlookNewContactsNode, NewOutlookNewContactsNode: PVirtualNode;
  405.  
  406.     procedure SanityCheck;
  407.     procedure ReadOutlookFolders;
  408.     procedure LoadSelectedOutlookFolder(Sender: TBaseVirtualTree;
  409.       Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
  410.     procedure LoadOutlookNewContactsFolder(Sender: TBaseVirtualTree;
  411.       Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
  412.     procedure PickDefaultOutlookNewContactsFolder(Sender: TBaseVirtualTree;
  413.       Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
  414.     procedure SaveSelectedOutlookFolder(Sender: TBaseVirtualTree;
  415.       Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
  416.     function Get_SelectedOutlookFolders: String;
  417.     procedure Set_SelectedOutlookFolders(const Value: String);
  418.     function Get_OutlookCategories: WideString;
  419.     procedure Set_OutlookCategories(const Value: WideString);
  420.     procedure SetOutlookNewContactsFolder(const Value: String);
  421.     function GetOutlookNewContactsFolder: String;
  422.     procedure SetupNewContactsFolder;
  423.   public
  424.     connectionType: Integer;
  425.     property SelectedOutlookFolders: String read Get_SelectedOutlookFolders write Set_SelectedOutlookFolders;
  426.     property OutlookCategories: WideString read Get_OutlookCategories write Set_OutlookCategories;
  427.     property OutlookNewContactsFolder: String read GetOutlookNewContactsFolder write SetOutlookNewContactsFolder;
  428.   end;
  429.  
  430. var
  431.   frmOptions: TfrmOptions;
  432.  
  433. implementation
  434.  
  435. uses WinSock, Unit1, uComposeSMS, uStatusDlg, uGlobal, uInputQuery;
  436.  
  437. {$R *.dfm}
  438.  
  439. type
  440.   TOutlookFolder = record
  441.     Folder: MAPIFolder;
  442.     NewContacts: Boolean;
  443.   end;
  444.   POutlookFolder = ^TOutlookFolder;
  445.  
  446. procedure TfrmOptions.edScriptPathChange(Sender: TObject);
  447. begin
  448.   lbScriptType.Caption := LowerCase(ExtractFileExt(edScriptPath.Text));
  449.   lbScriptType.Caption := Copy(lbScriptType.Caption, 2, length(lbScriptType.Caption));
  450. end;
  451.  
  452. procedure TfrmOptions.Button3Click(Sender: TObject);
  453. begin
  454.   OpenDialog1.InitialDir := ExtractFileDir(edScriptPath.Text);
  455.   OpenDialog1.FileName := ExtractFileName(edScriptPath.Text);
  456.   if OpenDialog1.Execute then
  457.     edScriptPath.Text := OpenDialog1.FileName;
  458. end;
  459.  
  460. procedure TfrmOptions.FormShow(Sender: TObject);
  461. begin
  462.   edScriptPathChange(nil);
  463.   case connectionType of
  464.   0: rbUseSerialClick(rbUseBluetooth);
  465.   1: rbUseSerialClick(rbUseIRDA);
  466.   2: rbUseSerialClick(rbUseSerial);
  467.   end;
  468.   PageControl1.ActivePageIndex := 0;
  469.   cbOutlookAllCategoriesClick(Self);
  470.   lblSMSCount.Caption := 'Messages sent so far:  '+IntToStr(Form1.FSMSCounter);
  471.   lblDevice.Caption := '';
  472.   rbBookmarksClick(nil);
  473. end;
  474.  
  475. procedure TfrmOptions.rbUseSerialClick(Sender: TObject);
  476. begin
  477.   if not (Sender as TRadioButton).Checked then
  478.     (Sender as TRadioButton).Checked := True;
  479.  
  480.   case (Sender as TRadioButton).Tag of
  481.   0:
  482.     begin
  483.       groupBluetoothSetup.Enabled := True;
  484.       groupSerialPortSetup.Enabled := False;
  485.     end;
  486.   1:
  487.     begin
  488.       groupBluetoothSetup.Enabled := False;
  489.       groupSerialPortSetup.Enabled := False;
  490.     end;
  491.   2:
  492.     begin
  493.       groupBluetoothSetup.Enabled := False;
  494.       groupSerialPortSetup.Enabled := True;
  495.     end;
  496.   end;
  497.  
  498.   connectionType := (Sender as TRadioButton).Tag;
  499.   btnLookupDevice.Enabled := not rbUseSerial.Checked or Form1.FConnected;
  500.   lblDevice.Caption := '';
  501. end;
  502.  
  503. procedure TfrmOptions.cbDontProgressClick(Sender: TObject);
  504. begin
  505.   cbProgressLongOnly.Enabled := not cbDontProgress.Checked;
  506.   cbProgressRestoredOnly.Enabled := not cbDontProgress.Checked;
  507. end;
  508.  
  509. procedure TfrmOptions.cbNoObexClick(Sender: TObject);
  510. begin
  511.   if cbNoObex.Checked then begin
  512.     { If no obex, disable other as well }
  513.     if not cbNoIRMC.Checked then begin
  514.       MessageBeep(MB_ICONASTERISK);
  515.       MessageDlg('Phonebook IRMC synchronization uses ObEx protocol, so this feature will be disabled as well!',
  516.         mtInformation,[mbOk],0);
  517.     end;
  518.     cbNoIRMC.Checked := True;
  519.     if not cbNoFolders.Checked then begin
  520.       MessageBeep(MB_ICONASTERISK);
  521.       MessageDlg('Phone folders browseing uses ObEx protocol, so this feature will be disabled (see Startup page)!',
  522.         mtInformation,[mbOk],0);
  523.     end;
  524.     cbNoFolders.Checked := True;
  525.     {}
  526.     cbNoIRMC.Enabled := False;
  527.     cbNoFolders.Enabled := False;
  528.     rbSync.Enabled := False;
  529.     cbObexPacketSize.Enabled := False;
  530.     lblObexPacketSize.Enabled := False;
  531.   end
  532.   else begin
  533.     cbNoIRMC.Enabled := True;
  534.     cbNoFolders.Enabled := True;
  535.     rbSync.Enabled := True;
  536.     cbObexPacketSize.Enabled := True;
  537.     lblObexPacketSize.Enabled := True;
  538.   end;
  539. end;
  540.  
  541. procedure TfrmOptions.ReadOutlookFolders;
  542. begin
  543.   tvOutlookFolders.NodeDataSize := SizeOf(TOutlookFolder);
  544.   tvOutlookFolders.RootNodeCount := NmSpace.Folders.Count;
  545. end;
  546.  
  547. procedure TfrmOptions.FormCreate(Sender: TObject);
  548. begin
  549. {$IFNDEF VER150}
  550.   Form1.ThemeManager1.CollectForms(Self);
  551. {$ENDIF}
  552.   { Make important widgets bold }
  553.   Label24.Font.Style := [fsBold];
  554.   Label25.Font.Style := [fsBold];
  555.   lbScriptType.Font.Style := [fsBold];
  556.   rbUseBluetooth.Font.Style := [fsBold];
  557.   rbUseIRDA.Font.Style := [fsBold];
  558.   rbUseSerial.Font.Style := [fsBold];
  559.   lblSMSCount.Font.Style := [fsBold];
  560.   FSelectedOutlookFolders := TStringList.Create;
  561. end;
  562.  
  563. procedure TfrmOptions.Button1Click(Sender: TObject);
  564. begin
  565.   SanityCheck;
  566.   ModalResult := mrOk;
  567. end;
  568.  
  569. procedure TfrmOptions.Button4Click(Sender: TObject);
  570. begin
  571.   seComposeSpin.Position := 200;
  572.   seMessageSpin.Position := 200;
  573.   seCallSpin.Position := 200;
  574.   seDebugSpin.Position := 200;
  575. end;
  576.  
  577. procedure TfrmOptions.chkMsgMClick(Sender: TObject);
  578. begin
  579.   cbNoMsgPopup.Enabled := chkMsgM.Checked;
  580.   cbNoMsgBaloon.Enabled := chkMsgM.Checked;
  581.   cbMsgToArchive.Enabled := chkMsgM.Checked;
  582.   cbMsgFullWarning.Enabled := chkMsgM.Checked;
  583. end;
  584.  
  585. procedure TfrmOptions.btnProximityTestClick(Sender: TObject);
  586. begin
  587.   SanityCheck;
  588.   btnProximityTest.Enabled := False;
  589.   btnProximityTest.Caption := 'Testing...';
  590.   try
  591.     Form1.DoProximityTest;
  592.   finally
  593.     btnProximityTest.Enabled := True;
  594.     btnProximityTest.Caption := 'Test Proximity';
  595.   end;
  596. end;
  597.  
  598. procedure TfrmOptions.SanityCheck;
  599. begin
  600.   if (rgProximityAway.ItemIndex = rgProximityNear.ItemIndex) and (rgProximityAway.ItemIndex <> 4) then
  601.     raise Exception.Create('Proximity settings cannot match for Away and Near');
  602. end;
  603.  
  604. procedure TfrmOptions.Button6Click(Sender: TObject);
  605. begin
  606.   Form1.FSMSCounter := 0;
  607.   Form1.FSMSCounterReseted := True;
  608.   if frmMessageContact.Visible then
  609.     frmMessageContact.FormActivate(frmMessageContact);
  610.   lblSMSCount.Caption := 'Messages sent so far: '+IntToStr(Form1.FSMSCounter);
  611. end;
  612.  
  613. procedure TfrmOptions.cbOutlookAllCategoriesClick(Sender: TObject);
  614. begin
  615.   lvOutlookCats.Enabled := not cbOutlookAllCategories.Checked;
  616.   if lvOutlookCats.Enabled then
  617.     lvOutlookCats.Color := clWindow
  618.   else
  619.     lvOutlookCats.Color := clBtnFace;
  620.   btAddCat.Enabled := lvOutlookCats.Enabled;
  621.   btDelCat.Enabled := lvOutlookCats.Enabled and
  622.     (lvOutlookCats.SelCount <> 0);
  623. end;
  624.  
  625. procedure TfrmOptions.btAddCatClick(Sender: TObject);
  626. var
  627.   s: WideString;
  628. begin
  629.   s := '';
  630.   if WideInputQuery('Add Category...','Enter category name:',s) then
  631.     with lvOutlookCats.Items.Add do begin
  632.       Caption := Trim(s);
  633.       ImageIndex := 0;
  634.     end;
  635. end;
  636.  
  637. procedure TfrmOptions.btDelCatClick(Sender: TObject);
  638. var
  639.   i: integer;
  640. begin
  641.   for i := lvOutlookCats.Items.Count-1 downto 0 do
  642.     if lvOutlookCats.Items[i].Selected then
  643.       lvOutlookCats.Items[i].Delete;
  644.   btDelCat.Enabled := False;
  645. end;
  646.  
  647. procedure TfrmOptions.tvOutlookFoldersFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
  648. var OutlookFolder: POutlookFolder;
  649. begin
  650.   OutlookFolder := Sender.GetNodeData(Node);
  651.   if Assigned(OutlookFolder) then
  652.     Finalize(OutlookFolder^)
  653. end;
  654.  
  655. procedure TfrmOptions.tvOutlookFoldersGetText(Sender: TBaseVirtualTree;
  656.   Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  657.   var CellText: WideString);
  658. var OutlookFolder: POutlookFolder;
  659. begin
  660.   OutlookFolder := Sender.GetNodeData(Node);
  661.   if Assigned(OutlookFolder) and Assigned(OutlookFolder.Folder) then
  662.     CellText := OutlookFolder.Folder.Name
  663.   else
  664.     CellText := 'Unknown';
  665. end;
  666.  
  667. procedure TfrmOptions.tvOutlookFoldersInitChildren(
  668.   Sender: TBaseVirtualTree; Node: PVirtualNode; var ChildCount: Cardinal);
  669. var OutlookFolder: POutlookFolder;
  670. begin
  671.   OutlookFolder := Sender.GetNodeData(Node);
  672.   if Assigned(OutlookFolder) and Assigned(OutlookFolder.Folder) then
  673.     ChildCount := OutlookFolder.Folder.Folders.Count
  674.   else
  675.     ChildCount := 0;
  676. end;
  677.  
  678. procedure TfrmOptions.tvOutlookFoldersInitNode(Sender: TBaseVirtualTree;
  679.   ParentNode, Node: PVirtualNode;
  680.   var InitialStates: TVirtualNodeInitStates);
  681. var OutlookFolder, ParentOutlookFolder: POutlookFolder;
  682. begin
  683.   OutlookFolder := Sender.GetNodeData(Node);
  684.   ParentOutlookFolder := Sender.GetNodeData(ParentNode);
  685.  
  686.   if Assigned(OutlookFolder) then begin
  687.     if Assigned(ParentOutlookFolder) then
  688.       OutlookFolder.Folder := ParentOutlookFolder.Folder.Folders.Item(Node.Index + 1)
  689.     else
  690.       OutlookFolder.Folder := NmSpace.Folders.Item(Node.Index + 1);
  691.  
  692.     if Assigned(OutlookFolder.Folder) then
  693.       if OutlookFolder.Folder.Folders.Count > 0 then
  694.         Include(InitialStates, ivsHasChildren);
  695.   end;
  696.  
  697.   Node.CheckType := ctTriStateCheckBox;
  698.   Include(InitialStates, ivsExpanded);
  699. end;
  700.  
  701. procedure TfrmOptions.SaveSelectedOutlookFolder(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
  702. var OutlookFolder: POutlookFolder;
  703. begin
  704.   if Node.CheckState = csCheckedNormal then begin
  705.     OutlookFolder := tvOutlookFolders.GetNodeData(Node);
  706.     if Assigned(OutlookFolder) and Assigned(OutlookFolder.Folder) then
  707.       FSelectedOutlookFolders.Add(OutlookFolder.Folder.EntryID);
  708.   end;
  709. end;
  710.  
  711. procedure TfrmOptions.LoadSelectedOutlookFolder(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
  712. var OutlookFolder: POutlookFolder;
  713. begin
  714.   OutlookFolder := tvOutlookFolders.GetNodeData(Node);
  715.   if Assigned(OutlookFolder) and Assigned(OutlookFolder.Folder) then begin
  716.     if FSelectedOutlookFolders.IndexOf(OutlookFolder.Folder.EntryID) <> -1 then
  717.       tvOutlookFolders.CheckState[Node] := csCheckedNormal
  718.     else
  719.       tvOutlookFolders.CheckState[Node] := csUnCheckedNormal;
  720.   end;
  721. end;
  722.  
  723. function TfrmOptions.Get_SelectedOutlookFolders: String;
  724. begin
  725.   if tvOutlookFolders.RootNodeCount <> 0 then begin
  726.     FSelectedOutlookFolders.Clear;
  727.     tvOutlookFolders.IterateSubtree(nil, SaveSelectedOutlookFolder, nil, [], True);
  728.   end;
  729.   Result := FSelectedOutlookFolders.DelimitedText;
  730. end;
  731.  
  732. procedure TfrmOptions.Set_SelectedOutlookFolders(const Value: String);
  733. var Folder: MAPIFolder;
  734. begin
  735.   FSelectedOutlookFolders.DelimitedText := Value;
  736.   if tvOutlookFolders.RootNodeCount <> 0 then begin
  737.     if (FSelectedOutlookFolders.DelimitedText = 'DEFAULT') and Assigned(NmSpace) then begin
  738.       Folder := NmSpace.GetDefaultFolder(olFolderContacts);
  739.       if Assigned(Folder) then
  740.         FSelectedOutlookFolders.DelimitedText := Folder.EntryID;
  741.     end;
  742.     tvOutlookFolders.IterateSubtree(nil, LoadSelectedOutlookFolder, nil, [], True);
  743.   end;
  744. end;
  745.  
  746. procedure TfrmOptions.FormDestroy(Sender: TObject);
  747. begin
  748.   FSelectedOutlookFolders.Free;
  749. end;
  750.  
  751. procedure TfrmOptions.cbNoProfilesClick(Sender: TObject);
  752. begin
  753.   if cbNoProfiles.Checked then begin
  754.     cbAutoProfile.Checked := False;
  755.     cbAutoProfile.Enabled := False;
  756.   end
  757.   else
  758.     cbAutoProfile.Enabled := True;
  759. end;
  760.  
  761. procedure TfrmOptions.chkStateMonitorClick(Sender: TObject);
  762. begin
  763.   cbDiagram.Enabled := chkStateMonitor.Checked;
  764.   if not cbDiagram.Enabled then cbDiagram.Checked := False;
  765. end;
  766.  
  767. procedure TfrmOptions.tvOutlookFoldersGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode;
  768.   Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer);
  769. var
  770.   OutlookFolder: POutlookFolder;
  771. begin
  772.   OutlookFolder := Sender.GetNodeData(Node);
  773.   if Assigned(OutlookFolder) and Assigned(OutlookFolder.Folder) then
  774.     case OutlookFolder.Folder.DefaultItemType of
  775.       olMailItem:        ImageIndex := 1;
  776.       olAppointmentItem: ImageIndex := 2;
  777.       olContactItem:     ImageIndex := 3;
  778.       olTaskItem:        ImageIndex := 4;
  779.       olJournalItem:     ImageIndex := 5;
  780.       olNoteItem:        ImageIndex := 6;
  781.       olPostItem:        ImageIndex := 7;
  782.       else ImageIndex := 0;
  783.     end
  784.   else
  785.     ImageIndex := -1;
  786. end;
  787.  
  788. procedure TfrmOptions.PageControl1Change(Sender: TObject);
  789. var
  790.   dlg: TfrmStatusDlg;
  791.   sel: string;
  792. begin
  793.   if (PageControl1.ActivePage = TabSheet11) and (tvOutlookFolders.RootNodeCount = 0) then begin
  794.     dlg := ShowStatusDlg('Reading Outlook Folders...',poMainFormCenter);
  795.     try
  796.       TabSheet11.Update;
  797.       sel := SelectedOutlookFolders;
  798.       tvOutlookFolders.BeginUpdate;
  799.       try
  800.         try
  801.           Outlook := CoOutlookApplication.Create;
  802.           NmSpace := Outlook.GetNamespace('MAPI');
  803.           ReadOutlookFolders;
  804.         except
  805.           Outlook := nil;
  806.           NmSpace := nil;
  807.           tvOutlookFolders.RootNodeCount := 0;
  808.         end;
  809.         SelectedOutlookFolders := sel; // reapply setting in order to select the folder
  810.         SetupNewContactsFolder;
  811.       finally
  812.         tvOutlookFolders.EndUpdate;
  813.       end;
  814.     finally
  815.       dlg.Free;
  816.     end;
  817.   end;
  818. end;
  819.  
  820. procedure TfrmOptions.btnLookupDeviceClick(Sender: TObject);
  821. var
  822.   SockName: TSockAddr;
  823.   i: integer;
  824. begin
  825.   lblDevice.Caption := 'Searching...';
  826.   lblDevice.Update;
  827.   btnLookupDevice.Enabled := False;
  828.   try
  829.     try
  830.       if rbUseBluetooth.Checked then begin
  831.         WBtSocket.Addr := edBTAddress.Text;
  832.         WBtSocket.Port := edBTPort.Text;
  833.         WBtSocket.Connect;
  834.         if WBtSocket.State = wsConnected then begin
  835.           i := WBtSocket.GetPeerName(SockName,Sizeof(SockName));
  836.           if i <> SOCKET_ERROR then
  837.             lblDevice.Caption := 'Found device: ' + StrPas(@SockName.sa_data[0]);
  838.           WBtSocket.Close;
  839.           if i = SOCKET_ERROR then
  840.             Abort;
  841.         end;
  842.       end;
  843.       if rbUseIRDA.Checked then begin
  844.         with WIrSocket.GetConnectedDevices do
  845.         try
  846.           i := Count;
  847.         if i > 0 then begin
  848.           lblDevice.Caption := 'Found device: ';
  849.           for i := 0 to i-1 do begin
  850.             if i <> 0 then lblDevice.Caption := lblDevice.Caption + ', ';
  851.               lblDevice.Caption := lblDevice.Caption + Items[0].irdaDeviceName;
  852.           end;
  853.         end
  854.         else
  855.           Abort;
  856.         finally
  857.           Free;
  858.         end;
  859.       end;
  860.       if rbUseSerial.Checked then begin
  861.         Form1.TxAndWait('ATI');
  862.         lblDevice.Caption := 'Found device: ' + Form1.FRxBuffer[0];
  863.         {
  864.         Form1.TxAndWait('AT+CGMM');
  865.         lblDevice.Caption := lblDevice.Caption + ' (' + Form1.FRxBuffer[0] + ')';
  866.         }
  867.       end;
  868.     except
  869.       lblDevice.Caption := '';
  870.     end;
  871.   finally
  872.     btnLookupDevice.Enabled := True;
  873.   end;
  874. end;
  875.  
  876. procedure TfrmOptions.btnSelectFavBookmClick(Sender: TObject);
  877. begin
  878.   PBFolderDialog1.Folder := edBookmarkDir.Text;
  879.   if PBFolderDialog1.Execute then
  880.     edBookmarkDir.Text := PBFolderDialog1.Folder;
  881. end;
  882.  
  883. procedure TfrmOptions.rbBookmarksClick(Sender: TObject);
  884. begin
  885.   edBookmarkDir.Enabled := rbBookmarks.ItemIndex <> 0;
  886.   if edBookmarkDir.Enabled then
  887.     edBookmarkDir.Color := clWindow
  888.   else
  889.     edBookmarkDir.Color := clBtnFace;
  890.   btnSelectFavBookm.Enabled := edBookmarkDir.Enabled;
  891.   Label30.Enabled := edBookmarkDir.Enabled;
  892.   Label31.Enabled := edBookmarkDir.Enabled;
  893. end;
  894.  
  895. procedure TfrmOptions.cbNoBookmarksClick(Sender: TObject);
  896. begin
  897.   if cbNoBookmarks.Checked then begin
  898.     cbAutoBookmarks.Checked := False;
  899.     cbAutoBookmarks.Enabled := False;
  900.   end
  901.   else
  902.     cbAutoBookmarks.Enabled := True;
  903. end;
  904.  
  905. procedure TfrmOptions.Button5Click(Sender: TObject);
  906. begin
  907.   cbForceUCS2.Checked := False;
  908.   cbStrictUCScheck.Checked := True;
  909. end;
  910.  
  911. procedure TfrmOptions.Button7Click(Sender: TObject);
  912. begin
  913.   seCommTimeoutSpin.Position := 10;
  914.   sePollingSpin.Position := 30;
  915.   cbDiagram.Checked := True;
  916.   chkStateMonitor.Checked := True;
  917.   chkStateMonitorClick(nil);
  918. end;
  919.  
  920. procedure TfrmOptions.Button8Click(Sender: TObject);
  921. begin
  922.   seMaxPacketSizeSpin.Position := 1024;
  923.   cbNoIRMC.Checked := False;
  924.   cbNoObex.Checked := False;
  925.   cbNoObexClick(nil);
  926. end;
  927.  
  928. procedure TfrmOptions.Button9Click(Sender: TObject);
  929. begin
  930.   rbOutlookNewAction.ItemIndex := 0;
  931.   cbOutlookAllCategories.Checked := True;
  932.   cbOutlookAllCategoriesClick(nil);
  933. end;
  934.  
  935. procedure TfrmOptions.lvOutlookCatsSelectItem(Sender: TObject;
  936.   Item: TListItem; Selected: Boolean);
  937. begin
  938.   btDelCat.Enabled := lvOutlookCats.SelCount <> 0;
  939. end;
  940.  
  941. function TfrmOptions.Get_OutlookCategories: WideString;
  942. var
  943.   i: integer;
  944. begin
  945.   Result := '';
  946.   for i := 0 to lvOutlookCats.Items.Count-1 do begin
  947.     if Result <> '' then Result := Result + ';';
  948.     Result := Result + WideQuoteStr(lvOutlookCats.Items[i].Caption);
  949.   end;
  950. end;
  951.  
  952. procedure TfrmOptions.Set_OutlookCategories(const Value: WideString);
  953. var
  954.   w: WideString;
  955. begin
  956.   w := Value;
  957.   lvOutlookCats.Items.Clear;
  958.   while w <> '' do begin
  959.     with lvOutlookCats.Items.Add do begin
  960.       Caption := GetFirstToken(w,';');
  961.       ImageIndex := 0;
  962.     end;
  963.   end;
  964. end;
  965.  
  966. procedure TfrmOptions.Button10Click(Sender: TObject);
  967. var
  968.   i: integer;
  969. begin
  970.   rgExplorer.ItemIndex := 0;
  971.   for i := 0 to gbOnConnecting.ControlCount-1 do
  972.     if gbOnConnecting.Controls[i] is TCheckBox then
  973.       (gbOnConnecting.Controls[i] as TCheckBox).Checked := False;
  974.   for i := 0 to gbOnConnected.ControlCount-1 do
  975.     if gbOnConnected.Controls[i] is TCheckBox then
  976.       (gbOnConnected.Controls[i] as TCheckBox).Checked := False;
  977. end;
  978.  
  979. procedure TfrmOptions.cbAutoBookmarksClick(Sender: TObject);
  980. begin
  981.   if cbAutoBookmarks.Checked then begin
  982.     MessageBeep(MB_ICONASTERISK);
  983.     MessageDlg('Bookmark synchronization is not implemented yet!',
  984.       mtInformation,[mbOk],0);
  985.     cbAutoBookmarks.Checked := False;
  986.   end;
  987. end;
  988.  
  989. procedure TfrmOptions.btnRefreshOutlookFoldersClick(Sender: TObject);
  990. var
  991.   seld,newc: string;
  992. begin
  993.   btnRefreshOutlookFolders.Enabled := False;
  994.   seld := SelectedOutlookFolders;
  995.   newc := OutlookNewContactsFolder;
  996.   tvOutlookFolders.RootNodeCount := 0;
  997.   Outlook := nil;
  998.   NmSpace := nil;
  999.   tvOutlookFolders.Update;
  1000.   tvOutlookFolders.BeginUpdate;
  1001.   try
  1002.     try
  1003.       Outlook := CoOutlookApplication.Create;
  1004.       NmSpace := Outlook.GetNamespace('MAPI');
  1005.       ReadOutlookFolders;
  1006.     except
  1007.       Outlook := nil;
  1008.       NmSpace := nil;
  1009.       tvOutlookFolders.RootNodeCount := 0;
  1010.     end;
  1011.     // reapply current setting 
  1012.     SelectedOutlookFolders := seld;
  1013.     OutlookNewContactsFolder := newc;
  1014.     SetupNewContactsFolder;
  1015.   finally
  1016.     tvOutlookFolders.EndUpdate;
  1017.     btnRefreshOutlookFolders.Enabled := True;
  1018.   end;
  1019. end;
  1020.  
  1021. procedure TfrmOptions.Button12Click(Sender: TObject);
  1022. begin
  1023.   SelectedOutlookFolders := 'DEFAULT';
  1024.   // this will reset OutlookNewContactsFolder as well
  1025.   SetupNewContactsFolder;
  1026. end;
  1027.  
  1028. procedure TfrmOptions.tvOutlookFoldersPaintText(Sender: TBaseVirtualTree;
  1029.   const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  1030.   TextType: TVSTTextType);
  1031. var OutlookFolder: POutlookFolder;
  1032. begin
  1033.   OutlookFolder := Sender.GetNodeData(Node);
  1034.  
  1035.   if Assigned(OutlookFolder) and OutlookFolder.NewContacts then
  1036.     TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold];
  1037. end;
  1038.  
  1039. procedure TfrmOptions.mniNewContactsClick(Sender: TObject);
  1040. var OutlookFolder: POutlookFolder;
  1041. begin
  1042.   if Assigned(NewOutlookNewContactsNode) and (NewOutlookNewContactsNode <> OutlookNewContactsNode) then begin
  1043.     OutlookFolder := tvOutlookFolders.GetNodeData(NewOutlookNewContactsNode);
  1044.  
  1045.     if Assigned(OutlookFolder) then begin
  1046.       OutlookFolder.NewContacts := True;
  1047.  
  1048.       // Reset old
  1049.       if Assigned(OutlookNewContactsNode) then begin
  1050.         OutlookFolder := tvOutlookFolders.GetNodeData(OutlookNewContactsNode);
  1051.  
  1052.         if Assigned(OutlookFolder) then begin
  1053.           OutlookFolder.NewContacts := False;
  1054.  
  1055.           tvOutlookFolders.InvalidateNode(OutlookNewContactsNode);
  1056.         end;
  1057.       end;
  1058.  
  1059.       OutlookNewContactsNode := NewOutlookNewContactsNode;
  1060.     end;
  1061.   end;
  1062. end;
  1063.  
  1064. procedure TfrmOptions.pmuOutlookFolderPopup(Sender: TObject);
  1065. var
  1066.   Pos: TPoint;
  1067. begin
  1068.   Pos := tvOutlookFolders.ScreenToClient(Mouse.CursorPos);
  1069.   NewOutlookNewContactsNode := tvOutlookFolders.GetNodeAt(Pos.X, Pos.Y);
  1070.  
  1071.   mniNewContacts.Enabled := Assigned(NewOutlookNewContactsNode) and (NewOutlookNewContactsNode.CheckState = csCheckedNormal);
  1072. end;
  1073.  
  1074. procedure TfrmOptions.SetupNewContactsFolder;
  1075. begin
  1076.   OutlookNewContactsNode := nil;
  1077.   tvOutlookFolders.IterateSubtree(nil, LoadOutlookNewContactsFolder, nil, [], True);
  1078.   // No folder selected, pick a default one
  1079.   if not Assigned(OutlookNewContactsNode) then
  1080.     tvOutlookFolders.IterateSubtree(nil, PickDefaultOutlookNewContactsFolder, nil, [], True);
  1081. end;
  1082.  
  1083. procedure TfrmOptions.SetOutlookNewContactsFolder(const Value: String);
  1084. begin
  1085.   FOutlookNewContactsFolder := Value;
  1086.  
  1087.   SetupNewContactsFolder;
  1088. end;
  1089.  
  1090. function TfrmOptions.GetOutlookNewContactsFolder: String;
  1091. var OutlookFolder: POutlookFolder;
  1092. begin
  1093.   if Assigned(OutlookNewContactsNode) then begin
  1094.     OutlookFolder := tvOutlookFolders.GetNodeData(OutlookNewContactsNode);
  1095.  
  1096.     if Assigned(OutlookFolder) then
  1097.       Result := OutlookFolder.Folder.EntryID;
  1098.   end;
  1099. end;
  1100.  
  1101. procedure TfrmOptions.LoadOutlookNewContactsFolder(
  1102.   Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer;
  1103.   var Abort: Boolean);
  1104. var OutlookFolder: POutlookFolder;
  1105. begin
  1106.   OutlookFolder := tvOutlookFolders.GetNodeData(Node);
  1107.   if Assigned(OutlookFolder) and Assigned(OutlookFolder.Folder) then begin
  1108.     OutlookFolder.NewContacts := OutlookFolder.Folder.EntryID = FOutlookNewContactsFolder;
  1109.     if OutlookFolder.NewContacts then
  1110.       OutlookNewContactsNode := Node;
  1111.   end;
  1112. end;
  1113.  
  1114. procedure TfrmOptions.PickDefaultOutlookNewContactsFolder(
  1115.   Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer;
  1116.   var Abort: Boolean);
  1117. var OutlookFolder: POutlookFolder;
  1118. begin
  1119.   OutlookFolder := tvOutlookFolders.GetNodeData(Node);
  1120.   if (Node.CheckState = csCheckedNormal) and Assigned(OutlookFolder) and Assigned(OutlookFolder.Folder) then begin
  1121.     FOutlookNewContactsFolder := OutlookFolder.Folder.EntryID;
  1122.     OutlookFolder.NewContacts := True;
  1123.     OutlookNewContactsNode := Node;
  1124.     Sender.InvalidateNode(Node);
  1125.     Abort := True;
  1126.   end;
  1127. end;
  1128.  
  1129. procedure TfrmOptions.tvOutlookFoldersChecked(Sender: TBaseVirtualTree;
  1130.   Node: PVirtualNode);
  1131. var OutlookFolder: POutlookFolder;
  1132. begin
  1133.   OutlookFolder := tvOutlookFolders.GetNodeData(Node);
  1134.  
  1135.   if (Node.CheckState = csCheckedNormal) and Assigned(OutlookFolder) and (OutlookNewContactsNode = nil) then begin
  1136.     OutlookFolder.NewContacts := True;
  1137.     OutlookNewContactsNode := Node;
  1138.     Sender.InvalidateNode(Node);
  1139.   end
  1140.   else if (Node.CheckState = csUnCheckedNormal) and Assigned(OutlookFolder) and OutlookFolder.NewContacts then begin
  1141.     OutlookFolder.NewContacts := False;
  1142.     OutlookNewContactsNode := nil;
  1143.     Sender.InvalidateNode(Node);
  1144.     Sender.IterateSubtree(nil, PickDefaultOutlookNewContactsFolder, nil, [], True);
  1145.   end;
  1146. end;
  1147.  
  1148. procedure TfrmOptions.cbNoIRMCClick(Sender: TObject);
  1149. begin
  1150.   if cbNoIRMC.Checked then begin
  1151.     { If no irmcSync, disable Outlook too }
  1152.     MessageBeep(MB_ICONASTERISK);
  1153.     MessageDlg('Outlook synchronization requires IRMC Sync, so this feature will be disabled as well!',
  1154.       mtInformation,[mbOk],0);
  1155.     cbAutoOutlookSync.Enabled := False;
  1156.     cbAutoOutlookSync.Checked := False;
  1157.   end
  1158.   else begin
  1159.     cbAutoOutlookSync.Enabled := True;
  1160.   end;
  1161. end;
  1162.  
  1163. end.
  1164.